
/*******************************************************************************
 * Copyleft (c) 2021 Kcode
 *
 * @file    uda1341.c
 * @brief   Asoc框架下的codec部分，uda1341编解码芯片的iis与控制接口相关操作
 *          参考sound\soc\codecs\uda134x.c
 *
 * @note    1、构建一个snd_soc_dai_driver
 *          2、构建一个snd_soc_codec_driver
 *          3、注册它们
 * @author  K
 * @version 0.0.1
 * @date    2021-08-07
 * @license MulanPSL-1.0
 *
 * 文件修改历史：
 * <时间>       | <版本>    | <作者>  | <描述>
 * 2021-08-07   | v0.0.1    | Kcode   | uda1341编解码芯片的iis与控制接口相关操作
 * -----------------------------------------------------------------------------
 ******************************************************************************/

/*!
 * 核心结构体snd_soc_codec_driver(编解码芯片的控制相关)
 */
static struct snd_soc_codec_driver soc_codec_dev_uda1341 = {
};

/*!
 * 编解码芯片的具体操作函数
 */
static const struct snd_soc_dai_ops uda1341_dai_ops = {
};

/*!
 * 核心结构体snd_soc_dai_driver(编解码芯片的相关属性)
 */
static struct snd_soc_dai_driver uda1341_dai = {
	.name = "uda1341-iis",
	/* 播放功能 */
	.playback = {
		.stream_name = "Playback",
		.channels_min = 1,
		.channels_max = 2,
		.rates = UDA134X_RATES,
		.formats = UDA134X_FORMATS,
	},
	/* 录音功能 */
	.capture = {
		.stream_name = "Capture",
		.channels_min = 1,
		.channels_max = 2,
		.rates = UDA134X_RATES,
		.formats = UDA134X_FORMATS,
	},
	/* pcm operations */
	.ops = &uda1341_dai_ops,
};

/*!
 * @brief 关闭设备的函数，必须得有，否则程序编译报错
 * @return void
 */
static void uda1341_dev_release(struct device *dev)
{}

/*!
 * 分配注册一个名为uda1341_dev的平台设备
 */
static struct platform_device uda1341_dev = {
    .name    = "uda1341-codec",
    .id      = -1,
    .device  = {
        .release = uda1341_dev_release,
    },
};

/*!
 * @brief  根据名字，连接到对应的平台驱动与设备时所调用的函数
 * @return int
 */
static int uda1341_probe(struct platform_device * pdev)
{    
    return snd_soc_register_codec(&pdev->dev, 
        &soc_codec_dev_uda1341, &uda1341_dai, 1);
}

/*!
 * @brief 关闭平台驱动的函数，必须得有，否则程序编译报错
 * @return int
 */
static int uda1341_remove(struct platform_device * pdev)
{
    return snd_soc_unregister_codec(&pdev->dev);
}

/*!
 * 分配注册一个名为uda1341_dev的平台驱动
 */
struct platform_driver uda1341_drv = {
    .probe   = uda1341_probe,
    .remove  = uda1341_remove,
    .driver  = {
        .name = "uda1341-codec",
    },
};
        
/*!
 * @brief 入口函数
 * @return int 0：注册成功，1：注册失败
 */
static int uda1341_init(void)
{
    int ret = 0;
    
    ret = platform_device_register(&uda1341_dev);
    if (ret) {
        printk("Can not register platform uda1341_dev!\n");
        goto fail;
    }
    
    ret = platform_driver_register(&uda1341_drv);
    if (ret) {
        printk("Can not register platform uda1341_drv!\n");
        platform_device_unregister(&uda1341_dev);
        goto fail;
    }

fail:    
    return ret;
}

/*!
 * @brief 出口函数
 * @return int，
 */
static void uda1341_exit(void)
{
    platform_driver_unregister(&uda1341_drv);
    platform_device_unregister(&uda1341_dev);
}

/* 修饰 */
module_init(uda1341_init);
module_exit(uda1341_exit);

/* 协议 */
MODULE_LICENSE("GPL");


